class Axios {
	// 第一个参数如果是请求地址，那么第二个参数即是配置对象
	// 第一个参数就是配置对象
	// 调用request即是调用dispatchRequest
	request(configOrUrl, config={}){
		// configOrUrl:有可能是请求地址，也有可能是配置对象
		// config：配置对象
		// 如果configOrUrl是请求地址，那么config 即是配置对象
		// 如果configOrUrl是配置对象，那么config没有意义。
		
		// 如果configOrUrl是字符串（请求地址），那么config代表的是配置对象，
		// 将configOrUrl的值作为配置对象config的url属性值。
		// 否则将configOrUrl的值赋值给config
		if(typeof configOrUrl === "string") config.url = configOrUrl;
		else config = configOrUrl;
		// config ===>{url:'/info',method:"get"}
		
		// 请求方式:config.method优先级高
		config.method = (config.method || "get").toLowerCase();
		
		// 发送请求
		// 1- 返回的是一个Promise实例
		const dispatchRequest = function(){
			return new Promise(function(resolve,reject){
				const request = new XMLHttpRequest();
				request.responseType = "json";
				request.open(config.method,config.url);
				request.send();
				request.onload = function(){
					resolve({
						// 配置对象信息
						config,
						// 响应头
						headers:request.getAllResponseHeaders(),
						// 响应体
						data:request.response,
						// XMLHttpRequest实例
						request,
						// 状态码
						status:request.status,
						// 状态码说明
						statusText:request.statusText
					})
				}
			})
		}
		return dispatchRequest();
	}
}
function createInstance() {
	const context = new Axios();
	const instance = Axios.prototype.request.bind(context);
	return instance;
}
const axios = createInstance();
export default axios;